# -*- coding: utf-8 -*-

#-------------------------------------------------------------------------
# drawElements Quality Program utilities
# --------------------------------------
#
# Copyright 2015 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#-------------------------------------------------------------------------

import os
import string

# TODO remove
import sys
sys.path.append(os.path.dirname(os.path.dirname(__file__)))

from src_util import *
from khr_util.gen_str_util import addValuePrefix, genStrUtilProtos, genStrUtilImpls

# Bitfield mapping
BITFIELD_GROUPS = [
	# ClearBufferMask
	("BufferMask",		["DEPTH_BUFFER_BIT", "STENCIL_BUFFER_BIT", "COLOR_BUFFER_BIT"]),
	# MapBufferUsageMask
	("BufferMapFlags",	[
		"MAP_READ_BIT",
		"MAP_WRITE_BIT",
		"MAP_INVALIDATE_RANGE_BIT",
		"MAP_INVALIDATE_BUFFER_BIT",
		"MAP_FLUSH_EXPLICIT_BIT",
		"MAP_UNSYNCHRONIZED_BIT"
		]),
	# MemoryBarrierMask
	("MemoryBarrierFlags", [
		"VERTEX_ATTRIB_ARRAY_BARRIER_BIT",
		"ELEMENT_ARRAY_BARRIER_BIT",
		"UNIFORM_BARRIER_BIT",
		"TEXTURE_FETCH_BARRIER_BIT",
		"SHADER_IMAGE_ACCESS_BARRIER_BIT",
		"COMMAND_BARRIER_BIT",
		"PIXEL_BUFFER_BARRIER_BIT",
		"TEXTURE_UPDATE_BARRIER_BIT",
		"BUFFER_UPDATE_BARRIER_BIT",
		"FRAMEBUFFER_BARRIER_BIT",
		"TRANSFORM_FEEDBACK_BARRIER_BIT",
		"ATOMIC_COUNTER_BARRIER_BIT"
		]),
	# ShaderTypeMask
	("ShaderTypeMask",	[
		"VERTEX_SHADER_BIT",
		"FRAGMENT_SHADER_BIT",
		"COMPUTE_SHADER_BIT",
		"GEOMETRY_SHADER_BIT",
		"TESS_CONTROL_SHADER_BIT",
		"TESS_EVALUATION_SHADER_BIT"
		]),
]

# Enum mapping
ENUM_GROUPS = [
	# Common enums

	# ErrorCode
	("Error",				["NO_ERROR", "INVALID_ENUM", "INVALID_VALUE", "INVALID_OPERATION", "OUT_OF_MEMORY",
							 "INVALID_FRAMEBUFFER_OPERATION", "CONTEXT_LOST"]),
	# PixelType, partially
	("Type", [
		# GLES2 types
		"BYTE",
		"UNSIGNED_BYTE",
		"SHORT",
		"UNSIGNED_SHORT",
		"INT",
		"UNSIGNED_INT",
		"FLOAT",
		"FIXED",
		"UNSIGNED_SHORT_5_6_5",
		"UNSIGNED_SHORT_4_4_4_4",
		"UNSIGNED_SHORT_5_5_5_1",

		# GLES3 types
		"HALF_FLOAT",
		"INT_2_10_10_10_REV",
		"UNSIGNED_INT_2_10_10_10_REV",
		"UNSIGNED_INT_10F_11F_11F_REV",
		"UNSIGNED_INT_5_9_9_9_REV",
		"UNSIGNED_INT_24_8",
		"FLOAT_32_UNSIGNED_INT_24_8_REV",
		"SIGNED_NORMALIZED",
		"UNSIGNED_NORMALIZED",

		# Extension types
		"HALF_FLOAT_OES",
		]),

	# GetPName, also GettableState below
	("ParamQuery", [
		# Generic
		"LINE_WIDTH",
		"ALIASED_POINT_SIZE_RANGE",
		"ALIASED_LINE_WIDTH_RANGE",
		"CULL_FACE_MODE",
		"FRONT_FACE",
		"DEPTH_RANGE",
		"DEPTH_WRITEMASK",
		"DEPTH_CLEAR_VALUE",
		"DEPTH_FUNC",
		"STENCIL_CLEAR_VALUE",
		"STENCIL_FUNC",
		"STENCIL_FAIL",
		"STENCIL_PASS_DEPTH_FAIL",
		"STENCIL_PASS_DEPTH_PASS",
		"STENCIL_REF",
		"STENCIL_VALUE_MASK",
		"STENCIL_WRITEMASK",
		"STENCIL_BACK_FUNC",
		"STENCIL_BACK_FAIL",
		"STENCIL_BACK_PASS_DEPTH_FAIL",
		"STENCIL_BACK_PASS_DEPTH_PASS",
		"STENCIL_BACK_REF",
		"STENCIL_BACK_VALUE_MASK",
		"STENCIL_BACK_WRITEMASK",
		"VIEWPORT",
		"SCISSOR_BOX",
		"SCISSOR_TEST",
		"COLOR_CLEAR_VALUE",
		"COLOR_WRITEMASK",
		"UNPACK_ALIGNMENT",
		"PACK_ALIGNMENT",
		"MAX_TEXTURE_SIZE",
		"MAX_VIEWPORT_DIMS",
		"SUBPIXEL_BITS",
		"RED_BITS",
		"GREEN_BITS",
		"BLUE_BITS",
		"ALPHA_BITS",
		"DEPTH_BITS",
		"STENCIL_BITS",
		"POLYGON_OFFSET_UNITS",
		"POLYGON_OFFSET_FILL",
        "POLYGON_OFFSET_FACTOR",
		"TEXTURE_BINDING_2D",
		"SAMPLE_BUFFERS",
		"SAMPLES",
		"SAMPLE_COVERAGE_VALUE",
		"SAMPLE_COVERAGE_INVERT",

		"MAX_CUBE_MAP_TEXTURE_SIZE",
		"MAX_RENDERBUFFER_SIZE",

		# Program-related
		"MAX_VERTEX_ATTRIBS",
		"MAX_VERTEX_UNIFORM_VECTORS",
		"MAX_VARYING_VECTORS",
		"MAX_COMBINED_TEXTURE_IMAGE_UNITS",
		"MAX_VERTEX_TEXTURE_IMAGE_UNITS",
		"MAX_TEXTURE_IMAGE_UNITS",
		"MAX_FRAGMENT_UNIFORM_VECTORS"
		]),

	# *missing*
	# Program query
	("ProgramParam", [
		"ACTIVE_ATTRIBUTES",
		"ACTIVE_ATTRIBUTE_MAX_LENGTH",
		"ACTIVE_UNIFORMS",
		"ACTIVE_UNIFORM_BLOCKS",
		"ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH",
		"ACTIVE_UNIFORM_MAX_LENGTH",
		"ATTACHED_SHADERS",
		"DELETE_STATUS",
		"INFO_LOG_LENGTH",
		"LINK_STATUS",
		"PROGRAM_BINARY_RETRIEVABLE_HINT",
		"TRANSFORM_FEEDBACK_BUFFER_MODE",
		"TRANSFORM_FEEDBACK_VARYINGS",
		"TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH",
		"VALIDATE_STATUS",
		"GEOMETRY_INPUT_TYPE",
		"GEOMETRY_OUTPUT_TYPE",
		"GEOMETRY_VERTICES_OUT",
		"GEOMETRY_SHADER_INVOCATIONS",
		"PROGRAM_SEPARABLE",
		"COMPUTE_WORK_GROUP_SIZE",
		"ACTIVE_ATOMIC_COUNTER_BUFFERS",
		"TESS_CONTROL_OUTPUT_VERTICES",
		"TESS_GEN_MODE",
		"TESS_GEN_SPACING",
		"TESS_GEN_VERTEX_ORDER",
		"TESS_GEN_POINT_MODE",
		]),

	# *missing*
	# Uniform query
	("UniformParam", [
		"UNIFORM_TYPE",
		"UNIFORM_SIZE",
		"UNIFORM_NAME_LENGTH",
		"UNIFORM_BLOCK_INDEX",
		"UNIFORM_OFFSET",
		"UNIFORM_ARRAY_STRIDE",
		"UNIFORM_MATRIX_STRIDE",
		"UNIFORM_IS_ROW_MAJOR"
		]),

	# *missing*
	# Framebuffers
	("FramebufferAttachment",			["COLOR_ATTACHMENT0", "COLOR_ATTACHMENT1", "COLOR_ATTACHMENT2", "COLOR_ATTACHMENT3",
										 "COLOR_ATTACHMENT4", "COLOR_ATTACHMENT5", "COLOR_ATTACHMENT6", "COLOR_ATTACHMENT7",
										 "COLOR_ATTACHMENT8", "COLOR_ATTACHMENT9", "COLOR_ATTACHMENT10", "COLOR_ATTACHMENT11",
										 "COLOR_ATTACHMENT12", "COLOR_ATTACHMENT13", "COLOR_ATTACHMENT14", "COLOR_ATTACHMENT15",
										 "DEPTH_ATTACHMENT", "STENCIL_ATTACHMENT", "DEPTH_STENCIL_ATTACHMENT",
										 "BACK", "FRONT_LEFT", "FRONT_RIGHT", "BACK_LEFT", "BACK_RIGHT",
										 "DEPTH", "STENCIL"]),
	# *missing*
	("FramebufferAttachmentParameter",	["FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE", "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME",
										 "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL", "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE",
										 "FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER", "FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE",
										 "FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING", "FRAMEBUFFER_ATTACHMENT_RED_SIZE",
										 "FRAMEBUFFER_ATTACHMENT_GREEN_SIZE", "FRAMEBUFFER_ATTACHMENT_BLUE_SIZE",
										 "FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE", "FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE",
										 "FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE", "FRAMEBUFFER_ATTACHMENT_LAYERED"]),
	("FramebufferTarget",				["FRAMEBUFFER", "RENDERBUFFER", "DRAW_FRAMEBUFFER", "READ_FRAMEBUFFER"]),
	("FramebufferStatus",				["FRAMEBUFFER_COMPLETE", "FRAMEBUFFER_INCOMPLETE_ATTACHMENT", "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT",
										 "FRAMEBUFFER_INCOMPLETE_DIMENSIONS", "FRAMEBUFFER_UNSUPPORTED", "FRAMEBUFFER_INCOMPLETE_MULTISAMPLE",
										 "FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS"]),
	("FramebufferAttachmentType",		["NONE", "FRAMEBUFFER_DEFAULT", "TEXTURE", "RENDERBUFFER"]),
	("FramebufferColorEncoding",		["LINEAR", "SRGB"]),

	("FramebufferParameter", [
		"FRAMEBUFFER_DEFAULT_WIDTH",
		"FRAMEBUFFER_DEFAULT_HEIGHT",
		"FRAMEBUFFER_DEFAULT_SAMPLES",
		"FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS",
		"FRAMEBUFFER_DEFAULT_LAYERS",
		]),

	# Renderbuffers
	("RenderbufferParameter",			["RENDERBUFFER_WIDTH", "RENDERBUFFER_HEIGHT", "RENDERBUFFER_INTERNAL_FORMAT", "RENDERBUFFER_RED_SIZE",
										"RENDERBUFFER_GREEN_SIZE", "RENDERBUFFER_BLUE_SIZE", "RENDERBUFFER_ALPHA_SIZE", "RENDERBUFFER_DEPTH_SIZE",
										"RENDERBUFFER_STENCIL_SIZE", "RENDERBUFFER_SAMPLES"]),

	# Primitives
	("PrimitiveType",		["POINTS", "LINES", "LINE_STRIP", "LINE_LOOP", "TRIANGLES", "TRIANGLE_STRIP", "TRIANGLE_FAN", "LINES_ADJACENCY", "LINE_STRIP_ADJACENCY", "TRIANGLES_ADJACENCY", "TRIANGLE_STRIP_ADJACENCY"]),

	# Blending
	("BlendFactor",			["ZERO", "ONE", "SRC_ALPHA_SATURATE",
							 "SRC_COLOR", "ONE_MINUS_SRC_COLOR", "SRC_ALPHA", "ONE_MINUS_SRC_ALPHA",
							 "SRC1_COLOR", "ONE_MINUS_SRC1_COLOR", "SRC1_ALPHA", "ONE_MINUS_SRC1_ALPHA",
							 "DST_COLOR", "ONE_MINUS_DST_COLOR", "DST_ALPHA", "ONE_MINUS_DST_ALPHA",
							 "CONSTANT_COLOR", "ONE_MINUS_CONSTANT_COLOR", "CONSTANT_ALPHA", "ONE_MINUS_CONSTANT_ALPHA"]),
	("BlendEquation",		[
		"FUNC_ADD",
		"FUNC_SUBTRACT",
		"FUNC_REVERSE_SUBTRACT",
		"MIN",
		"MAX",
		"MULTIPLY_KHR",
		"SCREEN_KHR",
		"OVERLAY_KHR",
		"DARKEN_KHR",
		"LIGHTEN_KHR",
		"COLORDODGE_KHR",
		"COLORBURN_KHR",
		"HARDLIGHT_KHR",
		"SOFTLIGHT_KHR",
		"DIFFERENCE_KHR",
		"EXCLUSION_KHR",
		"HSL_HUE_KHR",
		"HSL_SATURATION_KHR",
		"HSL_COLOR_KHR",
		"HSL_LUMINOSITY_KHR",
		]),

	# Buffer Objects
	("BufferTarget",		[
		"ARRAY_BUFFER",
		"ELEMENT_ARRAY_BUFFER",
		"COPY_READ_BUFFER",
		"COPY_WRITE_BUFFER",
		"PIXEL_PACK_BUFFER",
		"PIXEL_UNPACK_BUFFER",
		"TRANSFORM_FEEDBACK_BUFFER",
		"UNIFORM_BUFFER",
		"DRAW_INDIRECT_BUFFER",
		"SHADER_STORAGE_BUFFER",
		"TEXTURE_BUFFER",
		"DISPATCH_INDIRECT_BUFFER",
		"ATOMIC_COUNTER_BUFFER",
		]),
	("BufferBinding",		["ARRAY_BUFFER_BINDING", "ELEMENT_ARRAY_BUFFER_BINDING"]),
	("Usage",				[
		"STREAM_DRAW",
		"STREAM_READ",
		"STREAM_COPY",
		"STATIC_DRAW",
		"STATIC_READ",
		"STATIC_COPY",
		"DYNAMIC_DRAW",
		"DYNAMIC_READ",
		"DYNAMIC_COPY"]),
	("BufferQuery",			["BUFFER_SIZE", "BUFFER_USAGE", "BUFFER_ACCESS_FLAGS", "BUFFER_MAPPED", "BUFFER_MAP_OFFSET", "BUFFER_MAP_LENGTH"]),

	# Culling
	("Face",				["FRONT", "BACK", "FRONT_AND_BACK"]),

	# Comparison function
	("CompareFunc",			["NEVER", "LESS", "LEQUAL", "GREATER", "EQUAL", "NOTEQUAL", "GEQUAL", "ALWAYS"]),

	# Enable-disable bit
	("EnableCap",			["TEXTURE_2D", "CULL_FACE", "BLEND", "DITHER", "STENCIL_TEST", "DEPTH_TEST", "SCISSOR_TEST",
							 "POLYGON_OFFSET_FILL", "SAMPLE_ALPHA_TO_COVERAGE", "SAMPLE_COVERAGE",
							 "PRIMITIVE_RESTART_FIXED_INDEX", "RASTERIZER_DISCARD",
							 "FRAMEBUFFER_SRGB", "SAMPLE_SHADING", "DEPTH_CLAMP",
							 "PRIMITIVE_RESTART", "SAMPLE_MASK", "DEBUG_OUTPUT", "DEBUG_OUTPUT_SYNCHRONOUS",
							 "BLEND_ADVANCED_COHERENT_KHR"]),

	# Indexed enable-disable bit
	("IndexedEnableCap",	["BLEND"]),

	# Polygon winding
	("Winding",				["CW", "CCW"]),

	# Hints
	("HintMode",			["DONT_CARE", "FASTEST", "NICEST"]),
	("Hint",				["GENERATE_MIPMAP_HINT"]),

	# Stencil ops
	("StencilOp",			["ZERO", "KEEP", "REPLACE", "INCR", "DECR", "INVERT", "INCR_WRAP", "DECR_WRAP"]),

	# Shader type
	("ShaderType",	[
		"VERTEX_SHADER",
		"FRAGMENT_SHADER",
		"COMPUTE_SHADER",
		"TESS_CONTROL_SHADER",
		"TESS_EVALUATION_SHADER",
		"GEOMETRY_SHADER",
		]),

	# Buffers
	("Buffer",				["COLOR", "DEPTH", "STENCIL", "DEPTH_STENCIL"]),

	# Invalidate buffer target
	("InvalidateAttachment",["COLOR", "DEPTH", "STENCIL",
							 "COLOR_ATTACHMENT0",
							 "COLOR_ATTACHMENT1",
							 "COLOR_ATTACHMENT2",
							 "COLOR_ATTACHMENT3",
							 "COLOR_ATTACHMENT4",
							 "COLOR_ATTACHMENT5",
							 "COLOR_ATTACHMENT6",
							 "COLOR_ATTACHMENT7",
							 "DEPTH_ATTACHMENT",
							 "STENCIL_ATTACHMENT",
							 "DEPTH_STENCIL_ATTACHMENT"]),

	# Draw/ReadBuffer attachment
	("DrawReadBuffer",		["COLOR", "DEPTH", "STENCIL", "BACK", "NONE",
							 "COLOR_ATTACHMENT0",
							 "COLOR_ATTACHMENT1",
							 "COLOR_ATTACHMENT2",
							 "COLOR_ATTACHMENT3",
							 "COLOR_ATTACHMENT4",
							 "COLOR_ATTACHMENT5",
							 "COLOR_ATTACHMENT6",
							 "COLOR_ATTACHMENT7",
							 "DEPTH_ATTACHMENT",
							 "STENCIL_ATTACHMENT",
							 "DEPTH_STENCIL_ATTACHMENT"]),

	# Textures
	("TextureTarget",		["TEXTURE_1D",
							 "TEXTURE_2D", "TEXTURE_CUBE_MAP",
							 "TEXTURE_CUBE_MAP_POSITIVE_X", "TEXTURE_CUBE_MAP_NEGATIVE_X",
							 "TEXTURE_CUBE_MAP_POSITIVE_Y", "TEXTURE_CUBE_MAP_NEGATIVE_Y",
							 "TEXTURE_CUBE_MAP_POSITIVE_Z", "TEXTURE_CUBE_MAP_NEGATIVE_Z",
							 "TEXTURE_3D", "TEXTURE_2D_ARRAY", "TEXTURE_2D_MULTISAMPLE",
							 "TEXTURE_2D_MULTISAMPLE_ARRAY",
							 "TEXTURE_BUFFER",
							 "TEXTURE_CUBE_MAP_ARRAY"]),
	("TextureParameter", [
		"TEXTURE_WRAP_S",
		"TEXTURE_WRAP_T",
		"TEXTURE_WRAP_R",
		"TEXTURE_BASE_LEVEL",
		"TEXTURE_MAX_LEVEL",
		"TEXTURE_COMPARE_MODE",
		"TEXTURE_COMPARE_FUNC",
		"TEXTURE_MAX_LOD",
		"TEXTURE_MIN_LOD",
		"TEXTURE_SWIZZLE_R",
		"TEXTURE_SWIZZLE_G",
		"TEXTURE_SWIZZLE_B",
		"TEXTURE_SWIZZLE_A",
		"TEXTURE_MIN_FILTER",
		"TEXTURE_MAG_FILTER",
		"DEPTH_STENCIL_TEXTURE_MODE",
		"TEXTURE_SRGB_DECODE_EXT",
		"TEXTURE_BORDER_COLOR",

		# Gettable only
		"TEXTURE_IMMUTABLE_LEVELS",
		"TEXTURE_IMMUTABLE_FORMAT",
		]),
	("TextureLevelParameter", [
		"TEXTURE_SAMPLES",
		"TEXTURE_FIXED_SAMPLE_LOCATIONS",
		"TEXTURE_WIDTH",
		"TEXTURE_HEIGHT",
		"TEXTURE_DEPTH",
		"TEXTURE_INTERNAL_FORMAT",
		"TEXTURE_RED_SIZE",
		"TEXTURE_GREEN_SIZE",
		"TEXTURE_BLUE_SIZE",
		"TEXTURE_ALPHA_SIZE",
		"TEXTURE_DEPTH_SIZE",
		"TEXTURE_STENCIL_SIZE",
		"TEXTURE_SHARED_SIZE",
		"TEXTURE_RED_TYPE",
		"TEXTURE_GREEN_TYPE",
		"TEXTURE_BLUE_TYPE",
		"TEXTURE_ALPHA_TYPE",
		"TEXTURE_DEPTH_TYPE",
		"TEXTURE_COMPRESSED",
		"TEXTURE_BUFFER_DATA_STORE_BINDING",
		"TEXTURE_BUFFER_OFFSET",
		"TEXTURE_BUFFER_SIZE",
		]),
	("RepeatMode",			["REPEAT", "CLAMP_TO_EDGE", "MIRRORED_REPEAT", "CLAMP_TO_BORDER"]),
	("TextureFilter",		["NEAREST", "LINEAR", "NEAREST_MIPMAP_NEAREST", "LINEAR_MIPMAP_NEAREST",
							 "NEAREST_MIPMAP_LINEAR", "LINEAR_MIPMAP_LINEAR"]),
	("TextureWrapMode",		["REPEAT", "CLAMP_TO_EDGE", "MIRRORED_REPEAT"]),
	("TextureSwizzle",		["RED", "GREEN", "BLUE", "ALPHA", "ZERO", "ONE"]),
	("TextureCompareMode",	["NONE", "COMPARE_REF_TO_TEXTURE"]),
	("CubeMapFace",			["TEXTURE_CUBE_MAP_POSITIVE_X", "TEXTURE_CUBE_MAP_NEGATIVE_X",
							 "TEXTURE_CUBE_MAP_POSITIVE_Y", "TEXTURE_CUBE_MAP_NEGATIVE_Y",
							 "TEXTURE_CUBE_MAP_POSITIVE_Z", "TEXTURE_CUBE_MAP_NEGATIVE_Z"]),
	("TextureDepthStencilMode",	["DEPTH_COMPONENT", "STENCIL_INDEX"]),
	("PixelStoreParameter",	[
		"UNPACK_ALIGNMENT",
		"UNPACK_IMAGE_HEIGHT",
		"UNPACK_ROW_LENGTH",
		"UNPACK_SKIP_IMAGES",
		"UNPACK_SKIP_ROWS",
		"UNPACK_SKIP_PIXELS",
		"PACK_ROW_LENGTH",
		"PACK_SKIP_ROWS",
		"PACK_SKIP_PIXELS"]),
	("UncompressedTextureFormat", [
		# GLES2 unsized formats
		"LUMINANCE",
		"LUMINANCE_ALPHA",
		"ALPHA",
		"RGB",
		"RGBA",

		# GLES2 sized formats
		"RGBA4",
		"RGB5_A1",
		"RGB565",
		"DEPTH_COMPONENT16",
		"STENCIL_INDEX8",

		# GLES3 unsized formats
		"RG",
		"RED",
		"RGBA_INTEGER",
		"RGB_INTEGER",
		"RG_INTEGER",
		"RED_INTEGER",
		"DEPTH_COMPONENT",
		"DEPTH_STENCIL",

		# GLES3 sized formats
		"RGBA32F",
		"RGBA32I",
		"RGBA32UI",
		"RGBA16",
		"RGBA16_SNORM",
		"RGBA16F",
		"RGBA16I",
		"RGBA16UI",
		"RGBA8",
		"RGBA8I",
		"RGBA8UI",
		"SRGB8_ALPHA8",
		"RGB10_A2",
		"RGB10_A2UI",
		"RGBA8_SNORM",
		"RGB8",
		"R11F_G11F_B10F",
		"RGB32F",
		"RGB32I",
		"RGB32UI",
		"RGB16",
		"RGB16_SNORM",
		"RGB16F",
		"RGB16I",
		"RGB16UI",
		"RGB8_SNORM",
		"RGB8I",
		"RGB8UI",
		"SRGB8",
		"RGB9_E5",
		"RG32F",
		"RG32I",
		"RG32UI",
		"RG16",
		"RG16_SNORM",
		"RG16F",
		"RG16I",
		"RG16UI",
		"RG8",
		"RG8I",
		"RG8UI",
		"RG8_SNORM",
		"R32F",
		"R32I",
		"R32UI",
		"R16",
		"R16_SNORM",
		"R16F",
		"R16I",
		"R16UI",
		"R8",
		"R8I",
		"R8UI",
		"R8_SNORM",
		"DEPTH_COMPONENT32F",
		"DEPTH_COMPONENT24",
		"DEPTH32F_STENCIL8",
		"DEPTH24_STENCIL8",

		# OES_required_internalformat
		"RGB10",

		# OES_depth32
		"DEPTH_COMPONENT32",

		# EXT_sRGB
		"SRGB",
		"SRGB_ALPHA",

		# GL_EXT_texture_sRGB_R8 & RG8
		"SR8_EXT",
		"SRG8_EXT",

		# GL_EXT_read_format_bgra
		"BGRA",
		]),

	("CompressedTextureFormat", [
		# ETC2/EAC formats
		"COMPRESSED_R11_EAC",
		"COMPRESSED_SIGNED_R11_EAC",
		"COMPRESSED_RG11_EAC",
		"COMPRESSED_SIGNED_RG11_EAC",
		"COMPRESSED_RGB8_ETC2",
		"COMPRESSED_SRGB8_ETC2",
		"COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2",
		"COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2",
		"COMPRESSED_RGBA8_ETC2_EAC",
		"COMPRESSED_SRGB8_ALPHA8_ETC2_EAC",

		# ASTC formats
		"COMPRESSED_RGBA_ASTC_4x4_KHR",
		"COMPRESSED_RGBA_ASTC_5x4_KHR",
		"COMPRESSED_RGBA_ASTC_5x5_KHR",
		"COMPRESSED_RGBA_ASTC_6x5_KHR",
		"COMPRESSED_RGBA_ASTC_6x6_KHR",
		"COMPRESSED_RGBA_ASTC_8x5_KHR",
		"COMPRESSED_RGBA_ASTC_8x6_KHR",
		"COMPRESSED_RGBA_ASTC_8x8_KHR",
		"COMPRESSED_RGBA_ASTC_10x5_KHR",
		"COMPRESSED_RGBA_ASTC_10x6_KHR",
		"COMPRESSED_RGBA_ASTC_10x8_KHR",
		"COMPRESSED_RGBA_ASTC_10x10_KHR",
		"COMPRESSED_RGBA_ASTC_12x10_KHR",
		"COMPRESSED_RGBA_ASTC_12x12_KHR",
		"COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR",
		"COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR",
		"COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR",
		"COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR",
		"COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR",
		"COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR",
		"COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR",
		"COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR",
		"COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR",
		"COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR",
		"COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR",
		"COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR",
		"COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR",
		"COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR",

		# EXT_texture_compression_s3tc
		"COMPRESSED_RGB_S3TC_DXT1_EXT",
		"COMPRESSED_RGBA_S3TC_DXT1_EXT",
		"COMPRESSED_RGBA_S3TC_DXT3_EXT",
		"COMPRESSED_RGBA_S3TC_DXT5_EXT",

		# IMG_texture_compression_pvrtc
		"COMPRESSED_RGB_PVRTC_4BPPV1_IMG",
		"COMPRESSED_RGB_PVRTC_2BPPV1_IMG",
		"COMPRESSED_RGBA_PVRTC_4BPPV1_IMG",
		"COMPRESSED_RGBA_PVRTC_2BPPV1_IMG",
		]),

	# Shader var type
	("ShaderVarType", [
		"FLOAT",
		"FLOAT_VEC2",
		"FLOAT_VEC3",
		"FLOAT_VEC4",
		"INT",
		"INT_VEC2",
		"INT_VEC3",
		"INT_VEC4",
		"UNSIGNED_INT",
		"UNSIGNED_INT_VEC2",
		"UNSIGNED_INT_VEC3",
		"UNSIGNED_INT_VEC4",
		"BOOL",
		"BOOL_VEC2",
		"BOOL_VEC3",
		"BOOL_VEC4",
		"FLOAT_MAT2",
		"FLOAT_MAT3",
		"FLOAT_MAT4",
		"FLOAT_MAT2x3",
		"FLOAT_MAT2x4",
		"FLOAT_MAT3x2",
		"FLOAT_MAT3x4",
		"FLOAT_MAT4x2",
		"FLOAT_MAT4x3",
		"SAMPLER_2D",
		"SAMPLER_3D",
		"SAMPLER_CUBE",
		"SAMPLER_2D_SHADOW",
		"SAMPLER_2D_ARRAY",
		"SAMPLER_2D_ARRAY_SHADOW",
		"SAMPLER_CUBE_SHADOW",
		"INT_SAMPLER_2D",
		"INT_SAMPLER_3D",
		"INT_SAMPLER_CUBE",
		"INT_SAMPLER_2D_ARRAY",
		"UNSIGNED_INT_SAMPLER_2D",
		"UNSIGNED_INT_SAMPLER_3D",
		"UNSIGNED_INT_SAMPLER_CUBE",
		"UNSIGNED_INT_SAMPLER_2D_ARRAY",
		"SAMPLER_2D_MULTISAMPLE",
		"INT_SAMPLER_2D_MULTISAMPLE",
		"UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE",
		"IMAGE_2D",
		"IMAGE_3D",
		"IMAGE_CUBE",
		"IMAGE_2D_ARRAY",
		"INT_IMAGE_2D",
		"INT_IMAGE_3D",
		"INT_IMAGE_CUBE",
		"INT_IMAGE_2D_ARRAY",
		"UNSIGNED_INT_IMAGE_2D",
		"UNSIGNED_INT_IMAGE_3D",
		"UNSIGNED_INT_IMAGE_CUBE",
		"UNSIGNED_INT_IMAGE_2D_ARRAY",
		"UNSIGNED_INT_ATOMIC_COUNTER",
		"SAMPLER_2D_MULTISAMPLE_ARRAY",
		"INT_SAMPLER_2D_MULTISAMPLE_ARRAY",
		"UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY",
		"SAMPLER_BUFFER",
		"INT_SAMPLER_BUFFER",
		"UNSIGNED_INT_SAMPLER_BUFFER",
		"IMAGE_BUFFER",
		"INT_IMAGE_BUFFER",
		"UNSIGNED_INT_IMAGE_BUFFER",
		"SAMPLER_CUBE_MAP_ARRAY",
		"SAMPLER_CUBE_MAP_ARRAY_SHADOW",
		"INT_SAMPLER_CUBE_MAP_ARRAY",
		"UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY",
		"IMAGE_CUBE_MAP_ARRAY",
		"INT_IMAGE_CUBE_MAP_ARRAY",
		"UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY",
	]),

	# Shader params
	("ShaderParam", [ "SHADER_TYPE", "DELETE_STATUS", "COMPILE_STATUS", "INFO_LOG_LENGTH", "SHADER_SOURCE_LENGTH"]),

	# Vertex attribute queries
	("VertexAttribParameterName", [
		"VERTEX_ATTRIB_ARRAY_BUFFER_BINDING",
		"VERTEX_ATTRIB_ARRAY_ENABLED",
		"VERTEX_ATTRIB_ARRAY_SIZE",
		"VERTEX_ATTRIB_ARRAY_STRIDE",
		"VERTEX_ATTRIB_ARRAY_TYPE",
		"VERTEX_ATTRIB_ARRAY_NORMALIZED",
		"VERTEX_ATTRIB_ARRAY_INTEGER",
		"VERTEX_ATTRIB_ARRAY_DIVISOR",
		"CURRENT_VERTEX_ATTRIB",
		"VERTEX_ATTRIB_BINDING",
		"VERTEX_ATTRIB_RELATIVE_OFFSET",
	]),

	("Boolean", ["FALSE", "TRUE"]),

	# GetPName
	("GettableState", [
		"ELEMENT_ARRAY_BUFFER_BINDING",				"ARRAY_BUFFER_BINDING",						"VERTEX_ARRAY_BINDING",								"VIEWPORT",									"DEPTH_RANGE",
		"TRANSFORM_FEEDBACK_BINDING",				"LINE_WIDTH",								"CULL_FACE_MODE",									"FRONT_FACE",								"POLYGON_OFFSET_FACTOR",
		"POLYGON_OFFSET_UNITS",						"SAMPLE_COVERAGE_VALUE",					"SAMPLE_COVERAGE_INVERT",							"ACTIVE_TEXTURE",							"TEXTURE_BINDING_1D",
		"TEXTURE_BINDING_2D",						"TEXTURE_BINDING_3D",						"TEXTURE_BINDING_2D_ARRAY",
		"TEXTURE_BINDING_CUBE_MAP",					"SAMPLER_BINDING",							"SCISSOR_BOX",										"STENCIL_FUNC",								"STENCIL_VALUE_MASK",
		"STENCIL_REF",								"STENCIL_FAIL",								"STENCIL_PASS_DEPTH_FAIL",							"STENCIL_PASS_DEPTH_PASS",					"STENCIL_BACK_FUNC",
		"STENCIL_BACK_VALUE_MASK",					"STENCIL_BACK_REF",							"STENCIL_BACK_FAIL",								"STENCIL_BACK_PASS_DEPTH_FAIL",				"STENCIL_BACK_PASS_DEPTH_PASS",
		"DEPTH_FUNC",								"BLEND_SRC_RGB",							"BLEND_SRC_ALPHA",									"BLEND_DST_RGB",							"BLEND_DST_ALPHA",
		"BLEND_EQUATION_RGB",						"BLEND_EQUATION_ALPHA",						"BLEND_COLOR",										"COLOR_WRITEMASK",							"DEPTH_WRITEMASK",
		"STENCIL_WRITEMASK",						"STENCIL_BACK_WRITEMASK",					"COLOR_CLEAR_VALUE",								"DEPTH_CLEAR_VALUE",						"STENCIL_CLEAR_VALUE",
		"DRAW_FRAMEBUFFER_BINDING",					"READ_FRAMEBUFFER_BINDING",					"RENDERBUFFER_BINDING",								"DRAW_BUFFER0",								"DRAW_BUFFER1",
		"DRAW_BUFFER2",								"DRAW_BUFFER3",								"DRAW_BUFFER4",										"DRAW_BUFFER5",								"DRAW_BUFFER6",
		"DRAW_BUFFER7",								"DRAW_BUFFER8",								"DRAW_BUFFER9",										"DRAW_BUFFER10",							"DRAW_BUFFER11",
		"DRAW_BUFFER12",							"DRAW_BUFFER13",							"DRAW_BUFFER14",									"DRAW_BUFFER15",							"READ_BUFFER",
		"UNPACK_IMAGE_HEIGHT",						"UNPACK_SKIP_IMAGES",						"UNPACK_ROW_LENGTH",								"UNPACK_SKIP_ROWS",							"UNPACK_SKIP_PIXELS",
		"UNPACK_ALIGNMENT",							"PACK_ROW_LENGTH",							"PACK_SKIP_ROWS",									"PACK_SKIP_PIXELS",							"PACK_ALIGNMENT",
		"PIXEL_PACK_BUFFER_BINDING",				"PIXEL_UNPACK_BUFFER_BINDING",				"CURRENT_PROGRAM",									"TRANSFORM_FEEDBACK_BUFFER_BINDING",		"TRANSFORM_FEEDBACK_PAUSED",
		"TRANSFORM_FEEDBACK_ACTIVE",				"UNIFORM_BUFFER_BINDING",					"GENERATE_MIPMAP_HINT",								"FRAGMENT_SHADER_DERIVATIVE_HINT",			"MAX_ELEMENT_INDEX",
		"SUBPIXEL_BITS",							"MAX_3D_TEXTURE_SIZE",						"MAX_TEXTURE_SIZE",									"MAX_ARRAY_TEXTURE_LAYERS",					"MAX_TEXTURE_LOD_BIAS",
		"MAX_CUBE_MAP_TEXTURE_SIZE",				"MAX_RENDERBUFFER_SIZE",					"MAX_DRAW_BUFFERS",									"MAX_COLOR_ATTACHMENTS",					"MAX_VIEWPORT_DIMS",
		"ALIASED_POINT_SIZE_RANGE",					"ALIASED_LINE_WIDTH_RANGE",					"MAX_ELEMENTS_INDICES",								"MAX_ELEMENTS_VERTICES",					"COMPRESSED_TEXTURE_FORMATS",
		"NUM_COMPRESSED_TEXTURE_FORMATS",			"PROGRAM_BINARY_FORMATS",					"NUM_PROGRAM_BINARY_FORMATS",						"SHADER_BINARY_FORMATS",					"NUM_SHADER_BINARY_FORMATS",
		"SHADER_COMPILER",							"MAX_SERVER_WAIT_TIMEOUT",					"NUM_EXTENSIONS",									"MAJOR_VERSION",							"MINOR_VERSION",
		"MAX_VERTEX_ATTRIBS",						"MAX_VERTEX_UNIFORM_COMPONENTS",			"MAX_VERTEX_UNIFORM_VECTORS",						"MAX_VERTEX_UNIFORM_BLOCKS",				"MAX_VERTEX_OUTPUT_COMPONENTS",
		"MAX_VERTEX_TEXTURE_IMAGE_UNITS",			"MAX_FRAGMENT_UNIFORM_COMPONENTS",			"MAX_FRAGMENT_UNIFORM_VECTORS",						"MAX_FRAGMENT_UNIFORM_BLOCKS",				"MAX_FRAGMENT_INPUT_COMPONENTS",
		"MAX_TEXTURE_IMAGE_UNITS",					"MIN_PROGRAM_TEXEL_OFFSET",					"MAX_PROGRAM_TEXEL_OFFSET",							"MAX_UNIFORM_BUFFER_BINDINGS",				"MAX_UNIFORM_BLOCK_SIZE",
		"UNIFORM_BUFFER_OFFSET_ALIGNMENT",			"MAX_COMBINED_UNIFORM_BLOCKS",				"MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS",			"MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS",	"MAX_VARYING_COMPONENTS",
		"MAX_VARYING_VECTORS",						"MAX_COMBINED_TEXTURE_IMAGE_UNITS",			"MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS",	"MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS",	"MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS",
		"SAMPLE_BUFFERS",							"SAMPLES",									"MAX_SAMPLES",										"DEPTH_BITS",								"STENCIL_BITS",
		"IMPLEMENTATION_COLOR_READ_TYPE",			"IMPLEMENTATION_COLOR_READ_FORMAT",			"COPY_READ_BUFFER_BINDING",							"COPY_WRITE_BUFFER_BINDING",				"RED_BITS",
		"GREEN_BITS",								"BLUE_BITS",								"ALPHA_BITS",										"MAX_COLOR_TEXTURE_SAMPLES",				"TIMESTAMP",
		"MAX_DEPTH_TEXTURE_SAMPLES",				"MAX_INTEGER_SAMPLES",						"TEXTURE_BINDING_2D_MULTISAMPLE",					"TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY",		"MAX_VERTEX_ATTRIB_STRIDE",
		"MAX_VERTEX_ATTRIB_BINDINGS",				"MAX_VERTEX_ATTRIB_RELATIVE_OFFSET",		"MIN_SAMPLE_SHADING_VALUE",							"FRAGMENT_INTERPOLATION_OFFSET_BITS",		"MAX_FRAGMENT_INTERPOLATION_OFFSET",
		"MIN_FRAGMENT_INTERPOLATION_OFFSET",		"MAX_GEOMETRY_SHADER_INVOCATIONS",			"LAYER_PROVOKING_VERTEX",							"MAX_GEOMETRY_UNIFORM_COMPONENTS",			"MAX_GEOMETRY_SHADER_STORAGE_BLOCKS",
		"MAX_GEOMETRY_UNIFORM_BLOCKS",				"MAX_GEOMETRY_INPUT_COMPONENTS",			"MAX_GEOMETRY_OUTPUT_COMPONENTS",					"MAX_GEOMETRY_IMAGE_UNIFORMS",				"MAX_GEOMETRY_TEXTURE_IMAGE_UNITS",
		"MAX_GEOMETRY_OUTPUT_VERTICES",				"MAX_GEOMETRY_ATOMIC_COUNTERS",				"MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS",				"MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS",		"MAX_FRAMEBUFFER_LAYERS",
		"PROVOKING_VERTEX",							"PRIMITIVE_RESTART_INDEX",					"MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS",				"MAX_FRAGMENT_ATOMIC_COUNTERS",				"MAX_FRAGMENT_IMAGE_UNIFORMS",
		"MAX_COMPUTE_UNIFORM_BLOCKS",				"MAX_COMPUTE_TEXTURE_IMAGE_UNITS",			"MAX_COMPUTE_UNIFORM_COMPONENTS",					"MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS",		"MAX_COMPUTE_ATOMIC_COUNTERS",
		"MAX_COMPUTE_IMAGE_UNIFORMS",				"MAX_COMPUTE_SHADER_STORAGE_BLOCKS",		"MAX_FRAGMENT_SHADER_STORAGE_BLOCKS",				"MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS",	"MAX_VERTEX_ATOMIC_COUNTER_BUFFERS",
		"MAX_VERTEX_ATOMIC_COUNTERS",				"MAX_VERTEX_IMAGE_UNIFORMS",				"MAX_VERTEX_SHADER_STORAGE_BLOCKS",					"MAX_COMBINED_SHADER_OUTPUT_RESOURCES",		"MAX_ATOMIC_COUNTER_BUFFER_BINDINGS",
		"MAX_ATOMIC_COUNTER_BUFFER_SIZE",			"MAX_IMAGE_UNITS",							"MAX_COMBINED_ATOMIC_COUNTER_BUFFERS",				"MAX_COMBINED_IMAGE_UNIFORMS",				"MAX_SHADER_STORAGE_BUFFER_BINDINGS",
		"MAX_SHADER_STORAGE_BLOCK_SIZE",			"MAX_COMBINED_ATOMIC_COUNTERS",				"MAX_COMBINED_SHADER_STORAGE_BLOCKS",				"SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT",	"PRIMITIVE_BOUNDING_BOX_EXT",
		"DRAW_INDIRECT_BUFFER_BINDING",				"MAX_SAMPLE_MASK_WORDS",					"PROGRAM_PIPELINE_BINDING",							"ATOMIC_COUNTER_BUFFER_BINDING",			"SHADER_STORAGE_BUFFER_BINDING",
		"DISPATCH_INDIRECT_BUFFER_BINDING",			"MAX_FRAMEBUFFER_WIDTH",					"MAX_FRAMEBUFFER_HEIGHT",							"MAX_FRAMEBUFFER_SAMPLES",					"MAX_COMPUTE_SHARED_MEMORY_SIZE",
		"MIN_PROGRAM_TEXTURE_GATHER_OFFSET",		"MAX_PROGRAM_TEXTURE_GATHER_OFFSET",		"MAX_COMPUTE_WORK_GROUP_INVOCATIONS",				"MAX_UNIFORM_LOCATIONS",					"MAX_DEBUG_MESSAGE_LENGTH",
		"MAX_DEBUG_LOGGED_MESSAGES",				"MAX_DEBUG_GROUP_STACK_DEPTH",				"MAX_LABEL_LENGTH",									"CONTEXT_FLAGS",							"DEBUG_LOGGED_MESSAGES",
		"DEBUG_NEXT_LOGGED_MESSAGE_LENGTH",			"DEBUG_GROUP_STACK_DEPTH",					"MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS",			"TEXTURE_BUFFER_OFFSET_ALIGNMENT",			"TEXTURE_BUFFER_BINDING",
		"TEXTURE_BINDING_BUFFER",					"MAX_TEXTURE_BUFFER_SIZE",					"MAX_PATCH_VERTICES",								"MAX_TESS_GEN_LEVEL",						"MAX_TESS_CONTROL_UNIFORM_COMPONENTS",
		"MAX_TESS_EVALUATION_UNIFORM_COMPONENTS",	"MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS",		"MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS",			"MAX_TESS_CONTROL_OUTPUT_COMPONENTS",		"MAX_TESS_PATCH_COMPONENTS",
		"MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS",	"MAX_TESS_EVALUATION_OUTPUT_COMPONENTS",	"MAX_TESS_CONTROL_UNIFORM_BLOCKS",					"MAX_TESS_EVALUATION_UNIFORM_BLOCKS",		"MAX_TESS_CONTROL_INPUT_COMPONENTS",
		"MAX_TESS_EVALUATION_INPUT_COMPONENTS",		"MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS",	"MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS",		"MAX_TESS_CONTROL_ATOMIC_COUNTERS",			"MAX_TESS_EVALUATION_ATOMIC_COUNTERS",
		"MAX_TESS_CONTROL_IMAGE_UNIFORMS",			"MAX_TESS_EVALUATION_IMAGE_UNIFORMS",		"MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS",	"MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS","MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS",
		"MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS",	"PATCH_VERTICES",							"PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED"
	]),

	("GettableIndexedState", [
		"TRANSFORM_FEEDBACK_BUFFER_BINDING",
		"UNIFORM_BUFFER_BINDING",
		"TRANSFORM_FEEDBACK_BUFFER_START",
		"TRANSFORM_FEEDBACK_BUFFER_SIZE",
		"UNIFORM_BUFFER_START",
		"UNIFORM_BUFFER_SIZE",
		"SAMPLE_MASK_VALUE",
		"VERTEX_BINDING_OFFSET",
		"VERTEX_BINDING_STRIDE",
		"VERTEX_BINDING_DIVISOR",
		"VERTEX_BINDING_BUFFER",
		"MAX_COMPUTE_WORK_GROUP_COUNT",
		"MAX_COMPUTE_WORK_GROUP_SIZE",
		"ATOMIC_COUNTER_BUFFER_BINDING",
		"ATOMIC_COUNTER_BUFFER_START",
		"ATOMIC_COUNTER_BUFFER_SIZE",
		"SHADER_STORAGE_BUFFER_BINDING",
		"SHADER_STORAGE_BUFFER_START",
		"SHADER_STORAGE_BUFFER_SIZE",
		"IMAGE_BINDING_NAME",
		"IMAGE_BINDING_LEVEL",
		"IMAGE_BINDING_LAYERED",
		"IMAGE_BINDING_LAYER",
		"IMAGE_BINDING_ACCESS",
		"IMAGE_BINDING_FORMAT",
		"BLEND_EQUATION_RGB",
		"BLEND_EQUATION_ALPHA",
		"BLEND_SRC_RGB",
		"BLEND_SRC_ALPHA",
		"BLEND_DST_RGB",
		"BLEND_DST_ALPHA",
		"COLOR_WRITEMASK",
	]),

	("GettableString", [
		"EXTENSIONS",
		"RENDERER",
		"SHADING_LANGUAGE_VERSION",
		"VENDOR",
		"VERSION"
	]),

	("PointerState", [
		"DEBUG_CALLBACK_FUNCTION",
		"DEBUG_CALLBACK_USER_PARAM",
	]),

	("InternalFormatParameter", ["NUM_SAMPLE_COUNTS", "SAMPLES"]),
	("InternalFormatTarget", [
		"RENDERBUFFER",
		"TEXTURE_2D_MULTISAMPLE",
		"TEXTURE_2D_MULTISAMPLE_ARRAY",
		"TEXTURE_2D",
		"TEXTURE_3D",
		"TEXTURE_2D_ARRAY",
		"TEXTURE_CUBE_MAP",
	]),

	("MultisampleParameter", ["SAMPLE_POSITION"]),

	# Occlusion and timer queries
	("QueryTarget", [
		"SAMPLES_PASSED",
		"ANY_SAMPLES_PASSED",
		"PRIMITIVES_GENERATED",
		"TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN",
		"TIME_ELAPSED",
	]),

	("QueryParam",			["CURRENT_QUERY", "QUERY_COUNTER_BITS"]),
	("QueryObjectParam",	["QUERY_RESULT", "QUERY_RESULT_AVAILABLE"]),

	("ImageAccess", ["READ_ONLY", "WRITE_ONLY", "READ_WRITE"]),

	("ProgramInterface", [
		"UNIFORM",
		"UNIFORM_BLOCK",
		"ATOMIC_COUNTER_BUFFER",
		"PROGRAM_INPUT",
		"PROGRAM_OUTPUT",
		"TRANSFORM_FEEDBACK_VARYING",
		"BUFFER_VARIABLE",
		"SHADER_STORAGE_BLOCK",
	]),

	("ProgramResourceProperty", [
		"ACTIVE_VARIABLES",
		"BUFFER_BINDING",
		"NUM_ACTIVE_VARIABLES",
		"ARRAY_SIZE",
		"ARRAY_STRIDE",
		"BLOCK_INDEX",
		"IS_ROW_MAJOR",
		"MATRIX_STRIDE",
		"ATOMIC_COUNTER_BUFFER_INDEX",
		"BUFFER_DATA_SIZE",
		"LOCATION",
		"NAME_LENGTH",
		"OFFSET",
		"REFERENCED_BY_VERTEX_SHADER",
		"REFERENCED_BY_FRAGMENT_SHADER",
		"REFERENCED_BY_COMPUTE_SHADER",
		"REFERENCED_BY_GEOMETRY_SHADER",
		"REFERENCED_BY_TESS_CONTROL_SHADER",
		"REFERENCED_BY_TESS_EVALUATION_SHADER",
		"TOP_LEVEL_ARRAY_SIZE",
		"TOP_LEVEL_ARRAY_STRIDE",
		"TYPE",
		"IS_PER_PATCH",
	]),

	("PrecisionFormatType", ["LOW_FLOAT", "MEDIUM_FLOAT", "HIGH_FLOAT", "LOW_INT", "MEDIUM_INT", "HIGH_INT"]),

	("TransformFeedbackTarget", ["TRANSFORM_FEEDBACK"]),

	("ProvokingVertex", ["FIRST_VERTEX_CONVENTION", "LAST_VERTEX_CONVENTION", "UNDEFINED_VERTEX"]),

	("DebugMessageSource", [
		"DEBUG_SOURCE_API",
		"DEBUG_SOURCE_WINDOW_SYSTEM",
		"DEBUG_SOURCE_SHADER_COMPILER",
		"DEBUG_SOURCE_THIRD_PARTY",
		"DEBUG_SOURCE_APPLICATION",
		"DEBUG_SOURCE_OTHER", "DONT_CARE"
	]),
	("DebugMessageType", [
		"DEBUG_TYPE_ERROR",
		"DEBUG_TYPE_DEPRECATED_BEHAVIOR",
		"DEBUG_TYPE_UNDEFINED_BEHAVIOR",
		"DEBUG_TYPE_PORTABILITY",
		"DEBUG_TYPE_PERFORMANCE",
		"DEBUG_TYPE_OTHER",
		"DEBUG_TYPE_MARKER",
		"DEBUG_TYPE_PUSH_GROUP",
		"DEBUG_TYPE_POP_GROUP",
		"DONT_CARE"
	]),
	("DebugMessageSeverity", [
		"DEBUG_SEVERITY_HIGH",
		"DEBUG_SEVERITY_MEDIUM",
		"DEBUG_SEVERITY_LOW",
		"DEBUG_SEVERITY_NOTIFICATION",
		"DONT_CARE"
	]),

	# Pipeline query
	("PipelineParam", [
		"ACTIVE_PROGRAM",
		"INFO_LOG_LENGTH",
		"VALIDATE_STATUS",
		"VERTEX_SHADER",
		"FRAGMENT_SHADER",
		"COMPUTE_SHADER",
		"GEOMETRY_SHADER",
		"TESS_CONTROL_SHADER",
		"TESS_EVALUATION_SHADER",
	]),

	("PatchParam", [
		"PATCH_VERTICES",
	]),

	("TextureFormat", [
		# generated: UncompressedTextureFormat + CompressedTextureFormat
	]),

	# GraphicsResetStatus
	("GraphicsResetStatus", [
		"NO_ERROR",
		"GUILTY_CONTEXT_RESET",
		"INNOCENT_CONTEXT_RESET",
		"UNKNOWN_CONTEXT_RESET",
	]),
]

def getEnumGroupByName (name):
	# \note: will raise an (index out of bounds) error if no such group
	return [x for x in ENUM_GROUPS if x[0]==name][0][1]

# EnableCap EnumGroups are also GettableState EnumGroups
getEnumGroupByName("GettableState").extend(getEnumGroupByName("EnableCap"))

# TextureFormat = UncompressedTextureFormat + CompressedTextureFormat
getEnumGroupByName("TextureFormat").extend(getEnumGroupByName("UncompressedTextureFormat") + getEnumGroupByName("CompressedTextureFormat"))

def genStrUtil (iface):
	enumGroups		= addValuePrefix(ENUM_GROUPS, "GL_")
	bitfieldGroups	= addValuePrefix(BITFIELD_GROUPS, "GL_")
	prototypeFile	= os.path.join(OPENGL_DIR, "gluStrUtilPrototypes.inl")
	implFile		= os.path.join(OPENGL_DIR, "gluStrUtil.inl")

	writeInlFile(prototypeFile, indentLines(genStrUtilProtos(iface, enumGroups, bitfieldGroups)))
	writeInlFile(implFile, genStrUtilImpls(iface, enumGroups, bitfieldGroups))

if __name__ == "__main__":
	genStrUtil(getHybridInterface())
